//验证服务器的有效性
/*
1.微信服务器识别开发者服务器,
    微信测试号管理页面   
    -用测试号中填写的url开发者服务器地址进行测试
        -使用小米求ngork实现本地内网穿透：
        http://wuyu.ngrok2.xiaomiqiu.cn
        https://wuyu.ngrok2.xiaomiqiu.cn
    -填写token:
    wuyu(自定义)
2.开发者服务器 - 验证消息是否从微信服务器传来
    目的：用过计算得出signature微信加密签名和微信服务器发来的signature进行对比，判断是否一致，一致表示消息来自微信服务器，否则，表示不是来自微信服务器。
    实现步骤：
     1.将参与微信加密签名的三个参数（timestamp，noces,token）按照字典排序在一起形成一个数组；
     2.将形成的数组中的所有参数拼接在一起形成一个字符串，进行sha1加密；
     3.将加密完成的signature和微信发送过来的进行对比：
        一致，表示消息来自微信服务器，
        否则，表示不是来自微信服务器
*/
// 引入sha1模块
const sha1 = require('sha1')
// 引入配置对象
const config = require('../config/index.js')

module.exports = () => {
    return (req, res, next) => {
        // 微信服务器发来的参数
        // console.log(req.query)
        /*{
            signature: '6cd0859504c3dcbab6bc5752e8b45cc3a137533b', // 微信的加密签名
            echostr: '7523796442737996953', // 微信发的随机字符串
            timestamp: '1623117841', // 微信发的时间戳
            nonce: '2076503949' // 微信发送的随机数字
        }
        */
        // 对象的结构赋值
        const {
            signature,
            echostr,
            timestamp,
            nonce
        } = req.query;
        const {
            token
        } = config;

        // 1.将参与微信加密签名的三个参数（timestamp，noces,token）按照字典排序在一起形成一个数组；
        const arr = [timestamp, nonce, token]
        const arrSort = arr.sort();
        // console.log(arrSort);

        //2.将形成的数组中的所有参数拼接在一起形成一个字符串，进行sha1加密；
        const str = arrSort.join('');
        // console.log(str);
        const sha1str = sha1(str);
        console.log(sha1str)

        //上述1.2步可简化为
        // const sha1str = sha1([timestamp, nonce, token].sort().join(''))

        //3.将加密完成的signature和微信发送过来的进行对比：
        if (sha1str == signature) {
            //如果一样，说明消息来自微信服务器，返回echostr给微信服务器
            res.send(echostr);
        } else {
            //如果不一样，说明不是微信服务器发来的消息，返回err
            res.end('靓仔，你在白嫖' + err)
        }
    }
}
